package megrez.mail.sender.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import megrez.mail.sender.domain.QueryService;
import megrez.mail.sender.domain.TemplateConfig;
import megrez.mail.sender.domain.TemplateConfigRepository;
import megrez.mail.sender.domain.TemplateContent;
import megrez.mail.sender.domain.TemplateContentRepository;
import megrez.mail.sender.web.vo.TemplateConfigInput;
import megrez.mail.sender.web.vo.TemplateConfigVO;
import megrez.mail.sender.web.vo.TemplateContentInput;
import megrez.mail.sender.web.vo.TemplateContentVO;

/**
 * 模板接口
 *  
 * @author Lucky Yang
 * @since 2.6.9
 */
@RestController
@RequestMapping("/v1/templates")
public class TemplateResource {
    @Autowired
    private QueryService querySrc;
    @Autowired
    private TemplateConfigRepository templateConfigRep;
    @Autowired
    private TemplateContentRepository templateContentRep;

    @PostMapping("/config")
    @ResponseStatus(HttpStatus.CREATED)
    public TemplateConfigVO create(@RequestBody TemplateConfigInput input) {
        TemplateConfig config = input.copyTo(new TemplateConfig());
        return TemplateConfigVO.of(templateConfigRep.save(config));
    }

    @PutMapping("/config/{id}")
    public TemplateConfigVO update(@PathVariable String id, @RequestBody TemplateConfigInput input) {
        TemplateConfig config = querySrc.findConfigById(id);
        return TemplateConfigVO.of(templateConfigRep.save(input.copyTo(config)));
    }

    @PostMapping("/content")
    @ResponseStatus(HttpStatus.CREATED)
    public TemplateContentVO create(@RequestBody TemplateContentInput input) {
        TemplateConfig config = querySrc.findConfigById(input.getConfigId());


        TemplateContent content = input.copyTo(new TemplateContent());
        content.setTemplateConfig(config);
        return TemplateContentVO.of(templateContentRep.save(content));
    }

    @PutMapping("/content/{id}")
    public TemplateContentVO update(@PathVariable String id, @RequestBody TemplateContentInput input) {
        TemplateContent content = querySrc.findContentById(id);
        return TemplateContentVO.of(templateContentRep.save(input.copyTo(content)));
    }

    @DeleteMapping("/config/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void remove(@PathVariable String id) {
        templateConfigRep.deleteById(id);
    }
}
